package com.cman777.springc.idempotence.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author chenzhicong
 * @time 2020/9/15 11:32
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface IdempotenceId {
    /**
     * 与salt共同决定IdempotenceId
     */
    String prefix() default "";
    /**
     * spel表达式
     */
    String salt();
    /**
     * 默认发生异常则删除幂等键，但有些情况不删除则填入这里，比如有些异常携带了业务含义
     * 就算重试了100次还是同样的结果，则添加异常类在这里
     */
    Class<? extends Exception>[] notDeleteForException() default {};

    /**
     * 触发幂等的策略
     * THROW_EXCEPTION： 抛出一个固定的异常
     * RETURN_RESULT： 抛出原来的异常（添加到notDeleteForException的异常），或原来的返回结果
     */
    Strategy strategy() default Strategy.RETURN_RESULT;

    enum Strategy{

        THROW_EXCEPTION("THROW_EXCEPTION","抛异常"),

        RETURN_RESULT("RETURN_RESULT","返回结果或抛出原异常");
        private String code;
        private String msg;
        Strategy(String code,String msg){
            this.code=code;
            this.msg = msg;
        }

    }
}
